--[[
    函数：lua_lock_activity_r
    功能：给秒杀项目加锁
    参数：ARGV[1]:r_id，字符串
    参数：ARGV[2]:user_id，字符串
    参数：ARGV[3]:lock_time 时间戳，字符串
    返回：0表示成功，1表示不存在场次或商品，2表示剩余锁不足，3表示用户抢购太频繁
--]]

-- 秒杀场次的key的前缀
local PREFIX_ACTIVITY_A = "activity_a_"
-- 秒杀项目的key的前缀
local PREFIX_ACTIVITY_R = "activity_r_"
-- 秒杀锁的key的前缀
local PREFIX_ACTIVITY_L = "activity_l_"
-- key的连接符号
local PREFIX_C = "_"
-- key的连接符号
local PREFIX_S = "*"

-- 查找秒杀项目
local key = PREFIX_ACTIVITY_R..PREFIX_S..PREFIX_C..ARGV[1]
local r_keys = redis.call('keys',key)
local len = #r_keys
if(len~=1)
then
    return 1
end



-- 剩余锁>0
local r_key = r_keys[1]
local rest_qty_str = redis.call('hget',r_key, 'rest_qty')
local rest_qty =tonumber(rest_qty_str) or 0
if(rest_qty<=0)
then
    return 2
end

-- 秒杀场次id
local act_id = redis.call('hget',r_key,'act_id')


-- 遍历锁表，如果锁表中存在user_id,且状态为0，则退出
local l_key = PREFIX_ACTIVITY_L..act_id..PREFIX_C..ARGV[1]..PREFIX_C..PREFIX_S
local l_keys = redis.call('keys',l_key)
local l_len = #l_keys
if(l_len>0)
then
    for i= 0, l_len-1 do
        -- 只检测success为0的锁
        local locks = redis.call('hmget',l_keys[i+1],'user_id','success')
        local success = tonumber(locks[2]) or 0
        if(success==0 )
        then
            -- 如果发现用户正在秒杀中，则加锁失败
    		local user_id2 = locks[1]
            if(user_id2==ARGV[2])
            then
                return 3
            end
        end
    end
end


-- 从秒杀项目中取得最大锁id，并自增
local lock_id = redis.call('hincrby',r_key, 'max_lock_id',1)
-- 增加锁记录
local l_key_new = PREFIX_ACTIVITY_L..act_id..PREFIX_C..ARGV[1]..PREFIX_C..lock_id
redis.call('hmset',l_key_new, 'create_time',ARGV[3], 'user_id',ARGV[2], 'success',0, 'act_id',act_id, 'r_id',ARGV[1])
-- 剩余锁减1
redis.call('hincrby',r_key, 'rest_qty',-1)

return 0